package com.cjq.auth.utils;

import org.springframework.stereotype.Component;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.UUID;
@Component
public class PasswordUtils{


    /**
     * 加盐并生成最终密码格式（方法一的重载），区别于上面的方法：这个方法是用来解密的，给定了盐值，生成一个最终密码，后面要和正确的最终密码进行比对
     * @param password 需要验证的明文密码
     * @param salt
     * @return
     */
    public static  String encrypt(String password, String salt){
        //1.生成一个加密后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        //2.生成最终的密码（待验证）
        return salt + "$" + saltPassword;
    }

    /**
     * 验证密码
     * @param inputPassword  登录用户输入的明文密码
     * @param finalPassword  数据库中实际的最终密码格式
     * @return
     */
    public static boolean check(String inputPassword, String finalPassword){
        //首先判断这两个参数到底有没有值,数据库中的最终密码是不是65位
        if(StringUtils.hasLength(inputPassword) && StringUtils.hasLength(finalPassword)
        && finalPassword.length() == 65){
            //a.首先从最终的密码中得到盐值
            //使用$将finalPassword划分成两个部分，前面的32位的部分就是盐值
            //注意：这里的$是被认为是一个通配符，所以要转义一下
            String salt = finalPassword.split("\\$")[0];
            //b.使用之前加密的方法，生成最终的密码格式（待验证）
            String checkPassword = encrypt(inputPassword,salt);
            return checkPassword.equals(finalPassword);
        }
        return false;
    }

    public static void main (String[] args) {
        // 原密码
        String password = "123456";
        // 加盐
        String salt = UUID.randomUUID().toString().replaceAll("-", "");
        System.out.println("明文(原生)密码：" + password);
        // 获取加盐后的MD5值
        String SaltPassword = encrypt(password, salt);
        System.out.println("加盐后的MD密码：" + SaltPassword);
        System.out.println("加盐后的密码和原生密码是否是同一字符串:" + check(password, SaltPassword));
    }
}
